import java.util.ArrayList;

/**
 * @author wcj
 * @Date 2021/6/1 14:52
 * @Version 1.0
 */
public class RuntimeConstantPoolOOM {

    /**
     * 因为JDK1.7已经逐步去永久代了，特别是将字符串常量池移动到了虚拟机堆中
     * JDK1.8更是将去永久代，将方法区改为了元数据区域移动到了外部
     * 因此此方法无法测试JDK1.7和JDK1.8只能测试JDK1.6
     *
     * @param args
     */
    public static void main(String[] args) {
//        ArrayList<String> strings = new ArrayList<>();
//        int i = 0;
//        while (true) {
//            strings.add(String.valueOf(i++).intern());
//        }

        // JDK1.6中为false,因为new创建的对象str1引用在堆上，str1.intern()在JDK6中是复制一份到常量池中
        // JDK1.7和JDK1.8中是true,因为第一次出现，不会复制，所以返回的是同一个
        String str1 = new StringBuilder("计算机").append("软件").toString();
        System.out.println(str1.intern() == str1);


        // JDK6,7,8返回的都是false，因为不是第一次出现，所以字符串常量池中已经有它的引用了，因此一个是常量池中的引用，一个是堆上的所以为false
        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2.intern() == str2);


    }
}
